#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ls (o<<1)
#define rs (o<<1 | 1)
const int N = 2e6+5;
int a[N], t[N*4], lz[N*4];

void update(int s, int e, int o, int x){
    t[o] += (e-s+1) * x;
    lz[o] += x;
}

void pushup( int o ){
    t[o] = t[ls] + t[rs];
}

void pushdown( int s, int e, int o ){
    if ( lz[o]==0 ) return;
    
    int mid = (s+e) / 2;
    update(s,mid,ls,lz[o]);
    update(mid+1,e,rs,lz[o]);
    lz[o] = 0;
}

void build(int s=0, int e=1e6+5, int o=1){
    if ( s==e ){
        t[o] = a[s];
        return;
    }
    int mid = (s+e) / 2;
    build(s,mid,ls);
    build(mid+1,e,rs);
    pushup(o);
}

void add(int l, int r, int x, int s=0, int e=1e6+5, int o=1){
    if ( l<=s && e<=r ){
        update(s,e,o,x);
        return;
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    if ( l<=mid ) add(l,r,x,s,mid,ls);
    if ( mid+1<=r ) add(l,r,x,mid+1,e,rs);
    pushup(o);
}

int query(int l, int r, int s=0, int e=1e6+5, int o=1){
    if ( l<=s && e<=r ){
        return t[o];
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    int res = 0;
    if ( l<=mid ) res += query(l,r,s,mid,ls);
    if ( mid+1<=r ) res += query(l,r,mid+1,e,rs);
    pushup(o);
    return res;
}

signed main(){
    memset(a,0,sizeof(a));
    build();
    int n; cin >> n;
    int mint = 2e18;
    int maxt = 0;
    
    while(n--){
        int l,r; cin >> l >> r;
        add(l,r-1,1);
        maxt = max(maxt,max(l,r));
        mint = min(mint,min(l,r));
    }
    // cout << "maxt = " << maxt << '\n';

    int ans1=0, ans2=0;
    int cnt1=0, cnt2=0;
    for ( int i=mint; i<=maxt-1; i++ ){
        int xx = query(i,i);
        if ( xx!=0 ){
            cnt1++;
            cnt2=0;
        } else {
            cnt2++;
            cnt1=0;
        }
        ans1 = max(ans1,cnt1);
        ans2 = max(ans2,cnt2);
    }

    cout << ans1 << ' ' << ans2 << '\n';


}
